package com.laiketui.payment.controller;

import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import com.laiketui.core.annotation.PreventDuplicateSubmit;
import com.laiketui.core.diyJavaFunction.StringUtils;
import com.laiketui.core.domain.Result;
import com.laiketui.core.exception.LaiKeAPIException;
import com.laiketui.core.lktconst.GloabConst;
import com.laiketui.domain.lktconst.DictionaryConst;
import com.laiketui.domain.vo.pay.PaymentVo;
import com.laiketui.order.api.feign.wechatPay.WeChatPayOrderFeign;
import com.laiketui.order.api.params.wechatPay.PaymentParams;
import com.laiketui.root.annotation.HttpApiMethod;
import github.wxpay.sdk.WXPayConstants;
import github.wxpay.sdk.WXPayUtil;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.collections.MapUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.net.URLDecoder;
import java.util.Map;

@RestController
@RequestMapping("/pay")
public class PayController {

//    @Autowired
//    private AlipayService alipayService;

//    @Autowired
//    private WalletPayService walletPayService;

//    @Autowired
//    private WechatPayService wechatPayServiceImpl;

    @Autowired
    private WeChatPayOrderFeign weChatPayOrderFeign;

        /**
     * 支付
     *
     * @param
     * @return
     */
    @PostMapping("/payOrder")
    @ApiOperation("支付入口")
    @HttpApiMethod(urlMapping = {"app.payment.payOrder"})
//    @PreventDuplicateSubmit
    public Result payOrder(@Validated PaymentParams params) {
        Map<String, String> resultMap = Maps.newHashMap();
        try {
            switch (params.getPayType()) {
                case DictionaryConst.OrderPayType.ORDERPAYTYPE_MINI_WECHAT:
                    resultMap = weChatPayOrderFeign.pay(params);
                    return Result.success(resultMap);
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_ALIPAY_MINIPAY:
//                    resultMap = alipayService.pay(params);
//                    return Result.success(resultMap);
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_ALIPAY:
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_ALIPAY_TMP:
//                    resultMap = alipayService.pay(params);
//                    return Result.success(resultMap.get("body"));
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_PC_ALIPAY:
//                    resultMap = alipayService.pay(params);
//                    return Result.success(resultMap.get("qr_code"));
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_ALIPAY_WAP:
//                    resultMap = alipayService.pay(params);
//                    return Result.success(resultMap.get("data"));
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_H5_WECHAT:
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_MINI_WECHAT:
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_JSAPI_WECHAT:
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_APP_WECHAT:
//                    resultMap = wechatPayServiceV2DubboImpl.pay(params);
//                    resultMap = (Map<String, Object>) resultMap.get("data");
//                    break;
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_PC_WECHAT:
//                    resultMap = wechatPayServiceV2DubboImpl.pay(params);
//                    resultMap = (Map<String, Object>) resultMap.get("data");
//                    return Result.success(resultMap.get("code_url"));
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_WALLET_PAY:
//                    resultMap = walletPayService.pay(params);
//                    break;
                default:
            }
            return Result.success(resultMap);
        } catch (LaiKeAPIException e) {
            return Result.error(e.getCode(), e.getMessage(), e.getMethod());
        }
    }

//    微信支付回调
    @PostMapping("/weChatNotify")
    @ApiOperation("支付回调")
    @HttpApiMethod(urlMapping = {"app.payment.weChatNotify"})
    public Result weChatNotifyV2(HttpServletRequest request) {
        try {
//            return Result.success(wechatPayServiceImpl.weChatNotifyV2(request));
            return Result.success(weChatPayOrderFeign.weChatNotifyV2(request));
        } catch (LaiKeAPIException e) {
            return Result.error(e.getCode(), e.getMessage(), e.getMethod());
        }
    }

//    /**
//     * 支付宝支付
//     *
//     * @param vo 用户所选支付类型 wallet：钱包 ali：支付宝 wx：微信
//     * @return
//     */
//    @PostMapping("/wallet_pay")
//    @ApiOperation("支付入口")
//    @HttpApiMethod(urlMapping = {"app.pay.wallet_pay", "app.pay.index", "mall.Pay.walletPay", "mall.Pay.index"})
//    @PreventDuplicateSubmit
//    public Result index(PaymentVo vo) {
//        Map<String, Object> resultMap = Maps.newHashMap();
//        try {
//            Map<String, Object> params = new HashMap<>(16);
//            params.put("paymentVo", vo);
//            switch (vo.getPayType()) {
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_ALIPAY_MINIPAY:
//                    resultMap = alipayService.pay(params);
//                    return Result.success(resultMap);
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_ALIPAY:
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_ALIPAY_TMP:
//                    resultMap = alipayService.pay(params);
//                    return Result.success(resultMap.get("body"));
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_PC_ALIPAY:
//                    resultMap = alipayService.pay(params);
//                    return Result.success(resultMap.get("qr_code"));
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_ALIPAY_WAP:
//                    resultMap = alipayService.pay(params);
//                    return Result.success(resultMap.get("data"));
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_H5_WECHAT:
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_MINI_WECHAT:
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_JSAPI_WECHAT:
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_APP_WECHAT:
//                    resultMap = wechatPayServiceV2DubboImpl.pay(params);
//                    resultMap = (Map<String, Object>) resultMap.get("data");
//                    break;
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_PC_WECHAT:
//                    resultMap = wechatPayServiceV2DubboImpl.pay(params);
//                    resultMap = (Map<String, Object>) resultMap.get("data");
//                    return Result.success(resultMap.get("code_url"));
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_WALLET_PAY:
//                    resultMap = walletPayService.pay(params);
//                    break;
//                default:
//            }
//            return Result.success(resultMap);
//        } catch (LaiKeAPIException e) {
//            return Result.error(e.getCode(), e.getMessage(), e.getMethod());
//        }
//    }
//
//    @PostMapping("getPayConfig")
//    @ApiOperation("获取支付配置")
//    @HttpApiMethod(urlMapping = {"app.order.get_config"})
//    public Result getPayConfig(PaymentVo paymentVo) {
//        Map<String, Object> resultMap = Maps.newHashMap();
//        try {
//            // 接收参数
//            String url = URLEncoder.encode(paymentVo.getUrl(), Charsets.UTF_8.name()); // 链接
//            String type = paymentVo.getType();// 支付类名称
//            // 返回参数
//            resultMap.put("url", url);
//            Map params = new HashMap();
//            params.put("paymentVo", paymentVo);
//            Map<String, Object> data = wechatPayServiceV2DubboImpl.getPayConfig(params);
//            resultMap.put("config", data.get("data"));
//            return Result.success(resultMap);
//        } catch (LaiKeAPIException e) {
//            return Result.error(e.getCode(), e.getMessage(), e.getMethod());
//        } catch (UnsupportedEncodingException e) {
//            e.printStackTrace();
//            return Result.error(ErrorCode.SysErrorCode.FUNCTION_NOT_EXISTS, e.getMessage(), "getPayConfig");
//        }
//    }
//
//
//    /**
//     * 支付宝支付退款
//     *
//     * @param payType
//     * @param storeId
//     * @param selectType 用户所选支付类型 wallet：钱包 ali：支付宝 wx：微信
//     * @return
//     */
//    public Result refund(String payType, int storeId, String selectType) {
//        Map<String, Object> resultMap = Maps.newHashMap();
//        try {
//            Map<String, Object> params = new HashMap<>(16);
//            params.put("storeId", storeId);
//            params.put("payType", payType);
//            //退款公共部分
//            switch (selectType) {
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_ALIPAY:
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_ALIPAY_TMP:
//                    resultMap = alipayService.refund(params);
//                    break;
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_MINI_WECHAT:
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_H5_WECHAT:
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_JSAPI_WECHAT:
//                    resultMap = wechatPayServiceV2DubboImpl.refund(params);
//                    break;
//                case DictionaryConst.OrderPayType.ORDERPAYTYPE_WALLET_PAY:
//                    resultMap = walletPayService.refund(params);
//                    break;
//                default:
//                    break;
//            }
//            return Result.success(resultMap);
//        } catch (LaiKeAPIException e) {
//            return Result.error(e.getCode(), e.getMessage(), e.getMethod());
//        }
//    }

}
